/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-06-15 15:44:17 +0000 (Fri, 15 Jun 2012) $
  Revision     : $Revision: 93 $
*******************************************/

package gui.proyecto;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;

import listeners.ManejadorEventoCambioTexto;
import mensaje.Mensaje;
import utilidad.IPropiedades;
import utilidad.Util;
import frente.Proyecto;
import gui.SeleccionarColorDialogo;

/**
 * Panel principal del dialogo de edicion de Proyectos.
 * <P>
 * Este panel, es incrustado en el dialogo 
 * de edicion de <code>Proyecto</code>. Contiene los 
 * componentes necesarios para crear un nuevo 
 * <code>Proyecto</code> o para editar uno existente.
 * 
 * @see Proyecto
 * @see EditarProyectoPanelControlador
 * 
 * @author jose.lara 07.06.2012
 */
public class EditarProyectoPanel extends JPanel {
    private static final long serialVersionUID = -615828103563738468L;
    
    private JTextField nombreTextField                  = null;
    private JTextField versionTextField                 = null;
    private JTextArea descripcionTextArea               = null;
    private JLabel colorValorLabel                      = null;
    private JButton seleccionarColorBoton               = null;
    private EditarProyectoPanelControlador controlador  = null;
    private ManejadorEventoCambioTexto escuchador       = null;
    private SeleccionarColorDialogo seleccionarColor    = null;
    private Color colorSeleccionado                     = null;
    
    public EditarProyectoPanel() {
        super();
        
        JLabel nombreLabel = new JLabel(Mensaje.getMensaje("DIALOGO_PROYECTO-LABEL_NOMBRE"));
        JLabel versionLabel = new JLabel(Mensaje.getMensaje("DIALOGO_PROYECTO-LABEL_VERSION"));
        JLabel descripcionLabel = new JLabel(Mensaje.getMensaje("DIALOGO_PROYECTO-LABEL_DESCRIPCION"));
        JLabel colorLabel = new JLabel(Mensaje.getMensaje("DIALOGO_PROYECTO-LABEL_COLOR"));
        
        JScrollPane scrollPanel = new JScrollPane();
        
        nombreTextField = new JTextField();
        nombreTextField.getDocument().addDocumentListener(getEscuchador());
        versionTextField = new JTextField();
        versionTextField.getDocument().addDocumentListener(getEscuchador());
        descripcionTextArea = new JTextArea();
        descripcionTextArea.getDocument().addDocumentListener(getEscuchador());
        colorValorLabel = new JLabel(Mensaje.getMensaje("DIALOGO_PROYECTO-LABEL_COLOR"));
        colorValorLabel.setOpaque(true);
        
        scrollPanel.setViewportView(descripcionTextArea);
        
        GroupLayout layout = new GroupLayout(this);
        layout.setHorizontalGroup(
            layout.createParallelGroup(Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(scrollPanel, GroupLayout.DEFAULT_SIZE, 430, Short.MAX_VALUE)
                            .addContainerGap())
                        .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(Alignment.LEADING, false)
                                .addComponent(nombreLabel, GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)
                                .addComponent(versionLabel, GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE))
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addGroup(layout.createParallelGroup(Alignment.LEADING)
                                .addComponent(nombreTextField, GroupLayout.DEFAULT_SIZE, 306, Short.MAX_VALUE)
                                .addComponent(versionTextField, GroupLayout.DEFAULT_SIZE, 306, Short.MAX_VALUE)
                                .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                                    .addComponent(colorValorLabel, GroupLayout.DEFAULT_SIZE, 189, Short.MAX_VALUE)
                                    .addPreferredGap(ComponentPlacement.RELATED)
                                    .addComponent(getSeleccionarColorBoton())))
                            .addContainerGap())
                        .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(colorLabel)
                            .addContainerGap(386, Short.MAX_VALUE))
                        .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(descripcionLabel, GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)
                            .addGap(322))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(nombreLabel)
                        .addComponent(nombreTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(versionLabel)
                        .addComponent(versionTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(colorLabel)
                        .addComponent(colorValorLabel)
                        .addComponent(getSeleccionarColorBoton()))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(descripcionLabel)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(scrollPanel, GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE)
                    .addContainerGap())
        );
        setLayout(layout);
    }
    
    protected JTextField getNombreTextField() {
        return nombreTextField;
    }
    
    protected JTextField getVersionTextField() {
        return versionTextField;
    }
    
    protected JTextArea getDescripcionTextArea() {
        return descripcionTextArea;
    }
    
    protected JLabel getColorValorLabel() {
        return colorValorLabel;
    }
    
    protected EditarProyectoPanelControlador getControlador() {
        if(controlador == null) {
            controlador = new EditarProyectoPanelControlador(this);
        }
        
        return controlador;
    }
    
    protected Color getColorSeleccionado() {
        return colorSeleccionado;
    }
    
    private void setColorSeleccionado(Color colorSeleccionado) {
        this.colorSeleccionado = colorSeleccionado;
    }
    
    private JButton getSeleccionarColorBoton() {
        if(seleccionarColorBoton == null) {
            seleccionarColorBoton = new JButton(Mensaje.getMensaje("DIALOGO_PROYECTO-LABEL_SEL_COLOR"));
            
            seleccionarColorBoton.addActionListener(new ActionListener() {
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    getSeleccionarColor().setVisible(true);
                }
            });
        }
        
        return seleccionarColorBoton;
    }
    
    private ManejadorEventoCambioTexto getEscuchador() {
        if(escuchador == null) {
            escuchador = new ManejadorEventoCambioTexto() {
                private static final long serialVersionUID = 3401130652473460303L;
                
                @Override
                public void textoCambia() {
                    notificarCambio();
                }
            };
        }
        
        return escuchador;
    }
    
    public SeleccionarColorDialogo getSeleccionarColor() {
        if(seleccionarColor == null) {
            seleccionarColor = new SeleccionarColorDialogo();
            seleccionarColor.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if(evt.getPropertyName().equals(IPropiedades.COLOR_SELECCIONADO)) {
                        actualizarColorProyecto((Color) evt.getNewValue());
                    }
                }
            });
        }
        seleccionarColor.setColorSeleccionado(getColorSeleccionado());
        
        return seleccionarColor;
    }

    public void setValoresProyecto(Proyecto proyecto) {
        Color colorProyecto = null;
        String descripcion  = null;
        String version      = null;
        String nombre       = null;
        
        if(proyecto != null) {
            descripcion = proyecto.getDescripcion();
            version = proyecto.getVersion();
            nombre = proyecto.getNombre();
            
            if(Util.cadenaValida(proyecto.getColor())) {
                colorProyecto = Color.decode(proyecto.getColor());
            }
        }
        
        getDescripcionTextArea().setText(descripcion);
        getVersionTextField().setText(version);
        getNombreTextField().setText(nombre);
        
        if(colorProyecto != null) {
            getColorValorLabel().setForeground(colorProyecto);
            getColorValorLabel().setBackground(colorProyecto);
            setColorSeleccionado(colorProyecto);
        }
    }
    
    private void notificarCambio() {
        firePropertyChange(IPropiedades.CAMBIO_DATOS, false, true);
    }
    
    private void actualizarColorProyecto(Color color) {
        getColorValorLabel().setBackground(color);
        getColorValorLabel().setForeground(color);
        setColorSeleccionado(color);
    }
}